<!DOCTYPE html>
<!--[if lt IE 7]> <html class="no-js ie6" lang="en"> <![endif]-->
<!--[if IE 7]>    <html class="no-js ie7" lang="en"> <![endif]-->
<!--[if IE 8]>    <html class="no-js ie8" lang="en"> <![endif]-->
<!--[if gt IE 8]><!-->  <html class="no-js" lang="en"> <!--<![endif]-->
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <title>今何チームローカルルール</title>
    <meta name="description" content="The local rule to develop android application">
    <meta name="author" content="KOZAKI Tsuneaki">
    <meta name="viewport" content="width=1024, user-scalable=no">
    
    <!-- Core and extension CSS files -->
    <link rel="stylesheet" href="../core/deck.core.css">
    <link rel="stylesheet" href="../extensions/goto/deck.goto.css">
    <link rel="stylesheet" href="../extensions/menu/deck.menu.css">
    <link rel="stylesheet" href="../extensions/navigation/deck.navigation.css">
    <link rel="stylesheet" href="../extensions/status/deck.status.css">
    <link rel="stylesheet" href="../extensions/hash/deck.hash.css">

    <!-- Theme CSS files (menu swaps these out) -->
    <link rel="stylesheet" id="style-theme-link" href="../themes/style/swiss.css">
    <link rel="stylesheet" id="transition-theme-link" href="../themes/transition/horizontal-slide.css">

    <!-- Custom CSS just for this page -->
    <link rel="stylesheet" href="introduction.css">

    <script src="../modernizr.custom.js"></script>
  </head>

  <body class="deck-container">

    <section class="slide">
      <h1>今何？アプリケーション開発ルール</h1>
    </section>

    <section class="slide">
      <h2>もくじ</h2>
      <ol>
        <li>
          Subversionの基礎
        </li>
        <li>
          Googlecode の基礎
        </li>
        <li>
        </li>
      </ol>
    </section>

    <section class="slide">
      <h2>Subversionの基礎</h2>
      <p>Subversionの基本的な概念とコマンドについて概説。知っている人は飛ばしてOK</p>
      <p>Subversionとはソースコードを管理するためのツールの一種です。似たようなツールとして
      <ul>
        <li>CVS (Concurrent Versions System)</li>
        <li>Git</li>
        <li>Bazaar</li>
        <li>Marcurial</li>
        <li>Visual Source Safe</li>
      </ul>
      などがあります。</p>
      <p>これらの違いについては、興味があれば各自勝手に調べてね。本プロジェクトではSubversionを利用することが決っているのでパス</p>
    </section>

    <section class="slide">
      <h2>バージョン管理の目的</h2>
      <p>ソースコードをバージョン管理する目的は、その変更履歴を保存することです。</p>
      <p>変更履歴を保存することで、ソースコードを変更した理由、人、日時、を知ることができます。また、以前の内容を簡単に復元することができます。</p>
    </section>

    <section class="slide">
      <h2>バージョン管理するべき対象</h2>
      <p>バージョン管理する対象は、すなわち履歴を保存する必要があるものすべてです。通常のファイルはもとより、画像ファイルや設定ファイル、あるいはディレクトリ構造も保存する必要があります</p>
      <p>Android開発では次のものが対象と考えればよいでしょう。
        <ol>
          <li>アクティビティなどを実装した *.javaファイル</li>
          <li>画面レイアウトや文字列リソースを記述した *.xmlファイル</li>
          <li>アプリケーションのビルドに必要な Manifest.xmlファイルなど</li>
          <li>同様にテストプロジェクトの *.javaやら *.xmlなど</li>
        </ol>
      </p>
      <p>逆にコンパイルして作成された *.apkファイルなどが保存されている bin ディレクトリはバージョン管理しません。自動生成されるR.javaも要らんような気がする </p>
    </section>

    <section class="slide">
      <h2>バージョン管理を利用した開発</h2>
      <p>ソースコードをバージョン管理しながら作業する場合、だいたい次のような段取りになります
        <ol>
          <li>リポジトリにあるソースをローカルに持ってくる (svn update)</li>
          <li>ローカルの環境でソースを編集、テストする</li>
          <li>ローカルで変更した内容をリポジトリに反映させる (svn commit)</li>
        </ol>
      </p>
      <p>一人で開発している場合、Subversion はバックアップ程度の意味しかありません。しかしソースコードをチーム内で共同で編集する場合には違います。自分がローカルで作業しちている間に他の人も別の場所でソースコードを編集する可能性があるのです。</p>
    </section>

    <section class="slide">
      <h2>競合とその解決</h2>
      <p>ソースコードを複数の人が編集して内容がバッティングする状況を競合(Conflict)と言います。このような状況に対処する方法として次の2つが考えられます</p>
      <p>
        <ul>
          <li>ロック方式</li>
          <p>編集する前にファイルに対してロックをかけて、他の人が編集できなくする</p>
          <li>コピー・マージ方式</li>
          <p>編集した後、競合が発生していたらマージする</p>
        </ul>
      </p>
      <p>当然、後者の方式で開発します。ロック方式を採用すると「アンロックへの圧力」のためスムーズに開発がすすみません。開発を始めようとする度に、今ロックしている人がいたら、その人にアンロックを依頼しなければならず、非効率的です。</p>
    </section>

    <section class="slide">
      <h2>競合が発生するタイミング</h2>
      <p>基本的に競合が発生するのはローカルでソースを編集して、正常動作を確認した後「さて、コミットするか」と思って svn commit を入力した場合です。
      </p>
      <p>この時、svn は「最新に比べて手元のファイルは古いよ」と文句を言ってくるので、最新を手に入れるべく svn update と入力します</p>
      <p>でもきっと手元のファイルと最新のファイルは競合しているので「競合しとるがな」と怒られます。編集している行が違うなど、Subversion が「単純にマージしてもダイジョウブそう」と判断すると適当にマージしてくれます。</p>
      <p>Subversion は単純なマージしかできないので、残りはあなたに任されます。どうすんの？て聞かれたら「p」として競合したファイルを開きましょう。&lt;&lt;&lt;&lt;&lt;.mine から ===== までが自分が変更した内容、その下がリポジトリの内容なので、適当に修正する。</p>
      <p>いい感じに修正したら、正常動作を確認してからコミットする。</p>
    </section>

    <section class="slide">
      <h2>まあ心配ないよ</h2>
      <p>結構ややこしいけど、そんなに競合は発生しないよ、きっと。</p>
      <p>基本的には「開発しよっかな」と思ったら svn update で最新のソースを取得して、開発終わったら svn commit するんだ。</p>
      <p>開発に時間がかかっても、中途半端な状態でコミットしてはいけない。他の人もリポジトリを見ていることは忘れてはいけない、中途半端なソースコードが他の人のローカルに入り込んでしまうと大変な混乱を招いてしまうよ。</p>
      <p>途中で開発を中断して数日経った後で開発を再開する時は再び svn update するんだ、休んでいる間に誰かがソースを更新しているかもしれないからね。競合具合が複雑で手に負えないなと感じたら、いったん自分のコードを横に置いておいて update するといいよ。</p>
      <p>他の人のした変更を眺めてから、自分の開発に着手すればいいんじゃないかな。</p>
    </section>

    <section class="slide">
      <h2>よく使う svn コマンド</h2>
      <p> <a href="http://www.thekyo.jp/manual/subversion/index.html">http://www.thekyo.jp/manual/subversion/index.html</a>参照</p>
      <ul>
        <li>svn checkout URL PATH</li>
        <p>URL にあるソースコードをローカルの場所 PATH に持ってきます。既に存在している PATH を指定しないように</p>
        <li>svn update</li>
        <p>既に checkout 済みの PATH の中でソースコードを最新の版に更新します。手元でソースを変更する前に update しましょう。</p>
        <li>svn commit</li>
        <p>ローカルで編集した内容をリポジトリに反映させます。誰か他の人が「最新」を更新していると失敗します。頑張ってマージしましょう</p>
        <li>svn status</li>
        <p>ローカルで編集した内容の一覧を表示します。A が追加、M が変更、D が削除、C が競合、? が管理課にないファイル、G は勝手にマージされた。</p>
        <li>svn log</li>
        <p>リポジトリに対する変更ログ。コミットメッセージの一覧とそのコミットをしたのが誰かがわかる </p>
        <li>svn diff</li>
        <p>ファイルに対する変更差分の表示、何も指定しなければ作業コピーとリポジトリ HEAD が比較される</p>
        <li>svn add</li>
        <p>新たにバージョン管理下に置きたいファイルを指定する。不用意に svn add . とかすると大抵不要なファイルも追加してしまうので止めときましょう。</p>
        <li>svn resolved</li>
        <p>競合を適当に解消した後、作成されていた一時ファイル(〜.mine とか 〜.r1 とか)を削除して、コミットできるようにする</p>
      </ul>
    </section>

    <section class="slide">
      <h2>もくじ</h2>
      <ol>
        <li style="color:silver;">
          Subversionの基礎
        </li>
        <li>
          Googlecode の基礎
        </li>
        <li style="color:silver;">
          設定について
        </li>
      </ol>
    </section>

    <section class="slide">
      <h2>Googlecodeの基礎</h2>
      <p>ソースコードを Subversion で管理することは決まったわけですが、リポジトリが必要です。野球スコアチームは社内のサーバーを利用するようですが、我等がチームは外部のホスティングサービスを使うよ。 </p>
      <p>なぜって？その方が面白いからだよ。広く使われているサービスなので「世間ではこんなアプリケーションが使われているのか」てのを知ることができるしね。 </p>
    </section>

    <section class="slide">
      <h2>ログインする</h2>
      <p> <a href="http://code.google.com/intl/ja/">http://code.google.com/intl/ja/</a>にアクセスしよう。右上すみに「ログイン」リンクがあるので、これをクリック。取得した gmail アドレスとパスワードを入力する</p>
      <p>やっぱり右上すみにある「お気に入り」リンクで「オープンソースプロジェクトを検索中です...」をクリック。日本語おかしいね。</p>
      <p>検索ボックスに fap-hello と入力すると、小崎がサンプルで作成した Hello world アンドロイドプロジェクトに到達するよ。これを checkout して作業してみよう。</p>
    </section>

    <section class="slide">
      <h2>コマンドラインで作業する</h2>
      <p>eclipse には subversion を利用するためのプラグインがいくつか存在して、第１回勉強会で導入した環境にも多分組込まれている。けど GUI の操作は説明が面倒だし、本質的ではないので各人調べてね。</p>
      <p>fap-hello プロジェクトの「Source」タブの「Checkout」を選ぶとチェックアウトの仕方が書いてある。eclipse のワークスペースの中に適当なプロジェクト名でチェックアウトしましょう。</p>
      <p>チェックアウトしたら、このディレクトリを eclipse からインポートすればできあがり。</p>
    </section>

    <section class="slide">
      <h2>もくじ</h2>
      <ol>
        <li style="color:silver;">
          Subversionの基礎
        </li>
        <li style="color:silver;">
          Googlecode の基礎
        </li>
        <li>
          設定について
        </li>
      </ol>
    </section>

    <section class="slide">
      <h2>設定について</h2>
      <p>悪いが小崎は自宅ではLinuxで作業しているので、文字コードは UTF-8、改行コードは LF なんだ。文字コードはそれでいいとして、改行コードは Windows の人は CR+LF なんだよね。この違いを吸収するよう各自設定して欲しい。</p>
      <p>何処かに subversion の設定ファイルがあるはず。TorotiseSVN は設定メニューから。Eclipse プラグインも設定メニューからできるはず。cygwin の人は多分 ~/.subversion/config を手で編集</p>
      <pre>
        enable-auto-props = yes
        ....
        *.xml        = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/xml
        *.java       = svn:eol-style=native; svn:keywords=Id; svn:mime-type=text/plain
      </pre>
      <p>java と xml ファイル以外の AndroidManifest.xml などは小崎が最初にコミットする時に setprop する予定</p>
    </section>

    <a href="#" class="deck-prev-link" title="Previous">&#8592;</a>
    <a href="#" class="deck-next-link" title="Next">&#8594;</a>

    <p class="deck-status">
      <span class="deck-status-current"></span>
      /
      <span class="deck-status-total"></span>
    </p>

    <form action="." method="get" class="goto-form">
      <label for="goto-slide">Go to slide:</label>
      <input type="number" name="slidenum" id="goto-slide">
      <input type="submit" value="Go">
    </form>

    <a href="." title="Permalink to this slide" class="deck-permalink">#</a>


    <!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>
    <script>window.jQuery || document.write('<script src="../jquery-1.6.4.min.js"><\/script>')</script>

      <!-- Deck Core and extensions -->
      <script src="../core/deck.core.js"></script>
      <script src="../extensions/menu/deck.menu.js"></script>
      <script src="../extensions/goto/deck.goto.js"></script>
      <script src="../extensions/status/deck.status.js"></script>
      <script src="../extensions/navigation/deck.navigation.js"></script>
      <script src="../extensions/hash/deck.hash.js"></script>

      <!-- Specific to this page -->
      <script src="introduction.js"></script>

  </body>
</html>
